# Presented By ZhaoEnxing
# time: 2021/10/20 10:06
# 在一项对学生资助贷款的研究中,美国教育部报告表明,
# 学生中享受了Stanford 4年期贷款的学生在毕业前欠款的平均数额为12168美元。
# 假定这一欠款数额的平均值是基于由480名学生贷款人组成的样本计算得来的,毕业前欠款数额的总体标准差为2200美元。
# 根据样本数据给出学生中享受了Stanford 4年期贷款在毕业前平均欠款数额的95%置信区间。

import numpy as np
import scipy
from scipy import stats
"""
   mean:样本均值
   std：样本标准差
   sig: 总体方差
   n:   样本量
   confidence：置信水平
   功能：构建总体均值的置信区间
   """
def mean_interval(mean=None, std=None, sig=None, n=None, confidence=0.95):

    alpha = 1 - confidence
    z_score = scipy.stats.norm.isf(alpha / 2)  # z分布临界值
    t_score = scipy.stats.t.isf(alpha / 2, df = (n-1) )  # t分布临界值

    if n >= 30 and sig != None:
        me = z_score*sig / np.sqrt(n)  # 误差
        lower_limit = mean - me
        upper_limit = mean + me

    if n >= 30 and sig == None:
        me = z_score*std / np.sqrt(n)
        lower_limit = mean - me
        upper_limit = mean + me

    if n < 30 and sig == None:
        me = t_score*std / np.sqrt(n)
        lower_limit = mean - me
        upper_limit = mean + me

    return (round(lower_limit, 3), round(upper_limit, 3))
print(mean_interval(mean=12168, std=2200, sig=None, n=480, confidence=0.95))
